题目描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
1 | 示例: |
分析
N皇后问题是一个非常经典的深度搜索的问题。他的递归搜索树如下图所示:
它的最重要的一点就是我们如何快速的判断不合法的情况。
首先明确不合法的情况有:
- 同一行不能有两个皇后:能在递归参数层面直接解决。
- 同一列不能有两个皇后:使用一个标记数组标记当前列是否被占用。
- 同一个对角线不能有两个皇后:
- 对角线1:用一个标记数组表示第i对角线1被占用
- 对角线2:用另一个标记数组表示第i对角线2被占用
这里最复杂的应该是对角线被占用的表示问题了,我们来看一下一种简便的表示方法:
对于对角线1如下图所示:
它一共有2n-1个,并且每一条对角线i+j都是相等的。
对于对角线2如下图所示:
同样也有2n-1个,它的规律是每一条对角线上两个元素相减是相等的,但是为了让它的结果能在0-2*n-1之间,所以我们使用i-j+n-1。
判断好了这几点,所以我们可以快速的写出答案了。
答案
1 | class Solution: |